# -*- coding: utf8 -*-

from pywow import SRP

# исходные данные
# переменные клиента начинаются на "c"
# сервера - на "s"
cusername = 'kreved'
cpassword = 'secret'
ssalt, sverifier = SRP.create_new_verifier('kreved', 'secret')
spfid = 0

def P_get(user):
 """эта функция должна возвращать [string]salt, [long]verifier по [string]имени пользователя
 
 в нашем случае она предельно проста
 в других случаях эти значения берутся из БД
 генерируются salt и verifier с помощью SRP.create_new_verifier(user, password)
 """
 if user == 'kreved':
  return (ssalt, sverifier)
 else:
  raise SRP.NoSuchUser, user

# клиент отправляет серверу своё имя
susername = cusername

# сервер получает имя
# находит по имени salt и verifier
ss, sv = P_get(susername)
# вычисляет что-то..
sb, sB = SRP.server_begin(sv)
# отправляет результаты клиенту
cs, cB = ss, sB

# клиент вычисляет что-то..
cA, ca = SRP.client_begin(cusername)
# клиент "calculate the session key and send the proof"
cK, cm = SRP.client_key(cusername, cpassword, cs, cB, cA, ca)
# отправляет m
scm = cm
# и отправляет cA
sA = cA

# сервер делает ещё вычисления..
sK, sm = SRP.server_key(susername, sA, sb, sB, ss, sv)

# сервер проверяет:
if scm <> sm:
 raise SRP.AuthFailure("Client authentication failed.")
# если они равны то всё ОК
# сервер вычисляет и отправляет proof
sproof = SRP.host_proof(sK, sA, sm)
csproof = sproof

# клиент проверяет
csproofeta = SRP.host_proof(cK, cA, cm)
if csproof <> csproofeta:
 raise SRP.AuthFailure("Host authentication failed.")

print "Connection established with keys:\n server: '%s'\n client: '%s'" % (sK, cK)
